﻿// B. Playing in a Casino.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1808/B

银河好运 "是整个太阳系的一家知名赌场，它推出了一款新的纸牌游戏。

在这个游戏中，一副牌由 n 张牌。每张牌上写有 m 个数字。n 名玩家每人 玩家都能从这副牌中得到一张牌。

然后，所有玩家成对对地进行游戏，每对玩家正好玩一次。因此，如果一共有四名玩家，那么就会进行六场比赛：第一场对第二场，第一场对第三场，第一场对第四场，
第二场对第三场，第二场对第四场，第三场对第四场。

每一局都以某种方式决定胜负，但规则相当复杂，在此就不一一介绍了。重要的是赢家会得到多少筹码。让第一位玩家的牌上的数字为 a1、a2......、am，
第二位玩家的牌上的数字为 b1、b2......、bm。那么游戏的获胜者就能从总彩池中获得|a1-b1|+|a2-b2|+⋯+|am-bm|筹码，其中|x|表示 x 的绝对值。

为了确定总彩池的大小，有必要计算赢家在所有游戏中的总奖金。由于一副牌中可能有很多张牌，也可能有很多玩家，因此你需要编写一个程序来完成所有必要的计算。



输入
每个测试由多个测试用例组成。第一行包含一个整数 t（1≤t≤1000）--测试用例数。测试用例说明如下。

每个测试用例的第一行包含两个整数 n 和 m（1≤n⋅m≤3⋅105）--扑克牌的张数和一张牌上的数字。

测试用例集下面 n 行中的每一行都包含 m 个整数 ci,j（1≤ci,j≤106）--第 i 张牌的描述。

保证所有测试的总 n⋅m 不超过 3⋅105。

输出
为每个测试用例打印一个数字 - 所有游戏的总奖金额。



InputCopy
3
1 4
4 15 1 10
4 3
1 2 3
3 2 1
1 2 1
4 2 7
3 5
1 4 2 8 5
7 9 2 1 4
3 8 5 3 1
OutputCopy
0
31
50


1
6 1
1
5
1
5
1
5


注意 考虑第一个测试案例。

在第一位棋手和第二位棋手的对局中，赢家获得的筹码为 |1-7|+|4-9|+|2-2|+|8-1|+|5-4|=19。

在第一位玩家和第三位玩家的对局中，获胜者获得|1-3|+|4-8|+|2-5|+|8-3|+|5-1|=18 个筹码。

在第二位玩家和第三位玩家的对局中，获胜者获得|7-3|+|9-8|+|2-5|+|1-3|+|4-1|=13 个筹码。

总筹码数为 19+18+13=50。

*/
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>


using namespace std;

int T;

const int N = 300010;
int a[N];
int n, m;
long long ans;

void solveinner(int col) {
	vector<int> v;
	for (int i = 0; i < n; i++) {
		v.push_back(a[i * m + col]);
	}
	sort(v.begin(), v.end());

	for (int i = 0; i < v.size() - 1; i++) {
		long long time = 1ll*(i + 1) * (v.size() - i - 1);
		ans += 1ll*(v[i + 1] - v[i]) * time;
	}

}

void solve() {
	cin >> n >> m;
	ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int num; cin >> num;
			a[i * m + j] = num;
		}
	}

	for (int i = 0; i < m; i++) {
		solveinner(i);
	}

	cout << ans << endl;
}


int main()
{
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

  